https://labuladong.online/algo/intro/complexity-basic/
今天是學習的第 1 天,主要學習了時間 / 空間複雜度:
O(2n²+3n+1) 等同於 O(n²)
O(1000n+1000) 等同於 O(n)
這邊可以簡單理解為:
範例一:時間複雜度 O(n),空間複雜度 O(1)
var getSum = function(nums) {
var sum = 0;
for (var i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}
演算法包含了一個 for 循環遍歷 nums
陣列,所以時間複雜度是 O(n),其中 n
代表 nums
陣列的長度。
演算法只使用了一個 sum
變數,這個 nums
是題目給的輸入,不算在演算法的空間複雜度裡面,所以空間複雜度是 O(1)。
範例二:時間複雜度 O(n),空間複雜度 O(1)
var sum = function(n) {
if (n % 10 !== 0) {
return -1;
}
var sum = 0;
for (var i = 0; i <= n; i++) {
sum += i;
}
return sum;
}
當 n
是 10 的倍數時,演算法才會執行 for 循環,時間複雜度是 O(n)。其他情況下演算法會直接返回,時間複雜度是 O(1)。
但是上面有提到在分析演算法複雜度時,分析的是「最壞情況」的複雜度,所以這個演算法的時間複雜度是 O(n),空間複雜度是 O(1)。
範例三:時間複雜度 O(n²),空間複雜度 O(1)
var hasTargetSum = function(nums, target) {
for (var i = 0; i < nums.length; i++) {
for (var j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return true;
}
}
}
return false;
}
因為演算法嵌套了兩層 for 循環,所以時間複雜度是 O(n²),其中 n 代表 nums
陣列的長度。
演算法只使用了 i, j
兩個變數,這是常數層級的空間消耗,所以空間複雜度是 O(1),因為上面有提到常數項和低增長項都可以忽略。